package pl.eskape.nawigacjapwr;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;

import java.util.ArrayList;

public class DbAdapter {
	
	private String DEBUG_TAG = "Baza danych NavigacjaPWR";
	
	//pola niezbędne !!! :)
	private SQLiteDatabase db;
	private Context context;
	private DatabaseHelper dbHelper;
	
	//Wersja bazy danych i nazwa pliku
	private static final int DB_VERSION = 1;
	private static final String DB_NAME = "database.db";
	
	//Tabele bazy danych
	private static final String DB_MIEJSCA_TABLE = "miejsca";
    private static final String DB_BUDYNKI_TABLE = "budynki";

    //Tabela Budynki
    public static final String KEY_NAZWA = "nazwa";
    public static final String NAZWA_OPTIONS = "TEXT";

    public static final String KEY_ADRES = "adres";
    public static final String ADRES_OPTIONS = "TEXT";

    public static final String KEY_GEO1 = "geo1";
    public static final String GEO1_OPTIONS = "TEXT";

    public static final String KEY_GEO2 = "geo2";
    public static final String GEO2_OPTIONS = "TEXT";

	
	
	//Tabela "Miejsca"
    /**
     * Jednostka Macierzysta miejsca
     * Numery od 1-12 to wydziały: odpowiednio 1 -> W1 ... 12 ->W12
     */

     public static final String KEY_JEDNOSTKA = "jednostka";
     public static final String JEDNOSTKA_OPTIONS  = "INT";

    //Miejsce może być "instystut", "dziekanat", itp...
	 public static final String KEY_RODZAJ = "rodzaj";
     public static final String RODZAJ_OPTIONS  = "TEXT";

     // pole o takiej samej nazwie i opcjach jak w tabeli powyzej
//   public static final String KEY_NAZWA = "nazwa";
//   public static final String NAZWA_OPTIONS  = "TEXT";

     public static final String KEY_SYMBOL = "symbol";
     public static final String SYMBOL_OPTIONS  = "TEXT";

     public static final String KEY_BUDYNEK = "budynek";
     public static final String BUDYNEK_OPTIONS  = "TEXT";


	 //usuwanie tabeli "Miejsca"
	 private static final String DROP_MIEJSCA_TABLE =
	            "DROP TABLE IF EXISTS " + DB_MIEJSCA_TABLE;

     //usuwanie tabeli "Budynki"
     private static final String DROP_BUDYNKI_TABLE =
            "DROP TABLE IF EXISTS " + DB_BUDYNKI_TABLE;
	 
	 //tworzenie tabeli "Budynki"
	 private static final String DB_CREATE_BUDYNKI_TABLE =
	            "CREATE TABLE " + DB_BUDYNKI_TABLE + "( " +
	            KEY_NAZWA + " " + NAZWA_OPTIONS + ", " +
	            KEY_ADRES + " " + ADRES_OPTIONS + ", " +
	            KEY_GEO1 + " " + GEO1_OPTIONS + ", " +
                KEY_GEO2 + " " + GEO2_OPTIONS +
	            ");";

    //tworzenie tabeli "Miejsca"
    private static final String DB_CREATE_MIEJSCA_TABLE =
            "CREATE TABLE " + DB_MIEJSCA_TABLE + "( " +
                    KEY_JEDNOSTKA + " " + JEDNOSTKA_OPTIONS + ", " +
                    KEY_RODZAJ + " " + RODZAJ_OPTIONS + ", " +
                    KEY_NAZWA + " " + NAZWA_OPTIONS + ", " +
                    KEY_SYMBOL + " " + SYMBOL_OPTIONS + ", " +
                    KEY_BUDYNEK + " " + BUDYNEK_OPTIONS +
                    ");";

    /**
    *   construktor adaptera
    */
	 public DbAdapter(Context context) {
		    this.context = context;
		}

    /**
     *  otwieranie połączenia z bazą :)
     */
	public DbAdapter open(){
		dbHelper = new DatabaseHelper(context, DB_NAME, null, DB_VERSION);
		try {
			 db = dbHelper.getWritableDatabase();
		}catch (SQLException e){
			 db = dbHelper.getReadableDatabase(); // tryb połączenia z db tylko do odczytu
		}
		return this;
	}

    /**
     *  zamykanie połączenia z bazą
     */
	public void close() {
		dbHelper.close();
	}


    /**
     * pobieranie ArrayListy z Miejscami danego wydziału
     */
    public ArrayList<Miejsce> pobierzMiejscaDlaWydzialu(int numerWydzialu){
        String where = " "+ KEY_JEDNOSTKA + " = " + numerWydzialu + " ";
        Cursor cursor =  db.query(DB_MIEJSCA_TABLE,null,where,null,null,null,null);
        Log.d(DEBUG_TAG, "Baza zawiera " + cursor.getCount() + " miejsc dla wydziału " + numerWydzialu);
        ArrayList<Miejsce> miejsca = new ArrayList<Miejsce>();
        if(cursor != null && cursor.moveToFirst()) {
            do {
                miejsca.add(new Miejsce(cursor.getString(0), cursor.getString(1),  cursor.getString(2), cursor.getString(3)));
            } while(cursor.moveToNext());
        }
        return miejsca;
    }

    /**
     * pobieranie ArrayListy z wszystkimi Miejscami z bazy danych
     */
    public ArrayList<Miejsce> pobierzWszystkieMiejsca(){
        Cursor cursor =  db.query(DB_MIEJSCA_TABLE,null,null,null,null,null,null);
        ArrayList<Miejsce> miejsca = new ArrayList<Miejsce>();
        Log.d(DEBUG_TAG, "Cała Baza zawiera " + cursor.getCount() + "wpisów");
        if(cursor != null && cursor.moveToFirst()) {
            do {
                miejsca.add(new Miejsce(cursor.getString(0), cursor.getString(1),  cursor.getString(2), cursor.getString(3)));
            } while(cursor.moveToNext());
        }
        return miejsca;
    }

    /**
     * pobieranie ArrayListy z wszystkimi Bydynkami z bazy danych
     */

    public ArrayList<Budynek> pobierzWszystkieBudynki(){
        Cursor cursor =  db.query(DB_BUDYNKI_TABLE,null,null,null,null,null,null);
        ArrayList<Budynek> miejsca = new ArrayList<Budynek>();
        Log.d(DEBUG_TAG, "Cała Baza zawiera " + cursor.getCount() + "wpisów");
        if(cursor != null && cursor.moveToFirst()) {
            do {
                miejsca.add(new Budynek(cursor.getString(0), cursor.getString(1),  cursor.getString(2), cursor.getString(3)));
            } while(cursor.moveToNext());
        }
        return miejsca;
    }



    /**
     * Klasa DatabaseHelper
     */
	 private class DatabaseHelper extends SQLiteOpenHelper {
		    public DatabaseHelper(Context context, String name,
		            CursorFactory factory, int version) {
		        super(context, name, factory, version);
		    }
		 
		    @Override
		    public void onCreate(SQLiteDatabase db) {
		    	Log.d(DEBUG_TAG, "Database creating...");
		    	
		        db.execSQL(DB_CREATE_BUDYNKI_TABLE);
		        Log.d(DEBUG_TAG, "Table " + DB_BUDYNKI_TABLE + " ver." + DB_VERSION + " created");

                db.execSQL(DB_CREATE_MIEJSCA_TABLE);
                Log.d(DEBUG_TAG, "Table " + DB_MIEJSCA_TABLE + " ver." + DB_VERSION + " created");

                try{
                    for(ContentValues cv : przygotuRekordyDoZapisaniaWTabeliBudynki())
                        db.insert(DB_BUDYNKI_TABLE,null, cv);
                    Log.d(DEBUG_TAG,"Wykonałem zapytania zapisujące do tabeli Budynki");
                }catch(Exception e){
                    Log.d(DEBUG_TAG,"Błąd przy zapisie Budynków" + przygotuRekordyDoZapisaniaWTabeliBudynki(), e);
                }


                try{
                    for(ContentValues cv : przygotuRekordyDoZapisaniaWTabeliMiejsca())
                        db.insert(DB_MIEJSCA_TABLE,null, cv);
                    Log.d(DEBUG_TAG,"Wykonałem zapytania zapisujące do tabeli Miejscai");
                }catch(Exception e){
                    Log.d(DEBUG_TAG,"Błąd przy zapisie Miejsc" + przygotuRekordyDoZapisaniaWTabeliMiejsca(), e);

                }
		    }
		 
		    @Override
		    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		    	Log.d(DEBUG_TAG, "Database updating...");
		    	db.execSQL(DROP_MIEJSCA_TABLE);
                db.execSQL(DROP_BUDYNKI_TABLE);

		    	Log.d(DEBUG_TAG, "All data is lost.");

		        onCreate(db);
		    }


		}

    private void dodajWpisyDoTabeliBudynki(ArrayList<ContentValues> dane){

    }

    private void dodajWpisyDoTabeliMiejsca(ArrayList<ContentValues> dane){
        try{
            for(ContentValues cv : dane)
                db.insert(DB_BUDYNKI_TABLE,null, cv);
        }catch(Exception e){
            Log.d(DEBUG_TAG,"Błąd przy zapisie Miejsc" + dane, e);

        }
    }

    private ArrayList<ContentValues> przygotuRekordyDoZapisaniaWTabeliMiejsca(){

        ArrayList<ContentValues> listCV = new ArrayList<ContentValues>();
        ContentValues tempCV = new ContentValues();

        //Dane Dziekanatu W1
        tempCV  = new ContentValues();
        tempCV.put("jednostka", "1");
        tempCV.put("rodzaj", "dziekanat");
        tempCV.put("nazwa", "Dziekanat Wydziału Architektury");
        tempCV.put("symbol", "pokój 21");
        tempCV.put("budynek", "E1");
        listCV.add(tempCV);

        //Dane Instytut Architektury i Urbanistyki
        tempCV = new ContentValues();
        tempCV.put("jednostka", "1");
        tempCV.put("rodzaj", "instytut");
        tempCV.put("nazwa", "Instytut Architektury i Urbanistyki");
        tempCV.put("symbol", "I1");
        tempCV.put("budynek", "E1");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "Dane Instytut Architektury i Urbanistyki do cv");

        //Dane Instytut Architektury, Sztuki i Techniki
        tempCV  = new ContentValues();
        tempCV.put("jednostka", "1");
        tempCV.put("rodzaj", "instytut");
        tempCV.put("nazwa", "Instytut Architektury, Sztuki i Techniki");
        tempCV.put("symbol", "I112");
        tempCV.put("budynek", "E5");
        listCV.add(tempCV);

        //Dane Dziekanatu W2
        tempCV  = new ContentValues();
        tempCV.put("jednostka", "2");
        tempCV.put("rodzaj", "dziekanat");
        tempCV.put("nazwa", "Dziekanat Wydziału Budownictwa Lądowego i Wodnego");
        tempCV.put("symbol", "pokój 502");
        tempCV.put("budynek", "E7");
        listCV.add(tempCV);

        //Dane INSTYTUT BUDOWNICTWA
        tempCV = new ContentValues();
        tempCV.put("jednostka", "2");
        tempCV.put("rodzaj", "instytut");
        tempCV.put("nazwa", "Instytut Budownictwa");
        tempCV.put("symbol", "I2");
        tempCV.put("budynek", "C7");
        listCV.add(tempCV);

        //Dane INSTYTUT GEOTECHNIKI I HYDROTECHNIKI
        tempCV = new ContentValues();
        tempCV.put("jednostka", "2");
        tempCV.put("rodzaj", "instytut");
        tempCV.put("nazwa", "Instytut Geotechniki i Hydrotechniki");
        tempCV.put("symbol", "I10");
        tempCV.put("budynek", "D2");
        listCV.add(tempCV);

        //Dane INSTYTUT INŻYNIERII LĄDOWEJ
        tempCV = new ContentValues();
        tempCV.put("jednostka", "2");
        tempCV.put("rodzaj", "instytut");
        tempCV.put("nazwa", "Instytut Inżynierii Lądowej");
        tempCV.put("symbol", "I14");
        tempCV.put("budynek", "L1");
        listCV.add(tempCV);

        //Dane Dziekanatu W3
        tempCV  = new ContentValues();
        tempCV.put("jednostka", "3");
        tempCV.put("rodzaj", "dziekanat");
        tempCV.put("nazwa", "Dziekanat Wydziału Chemicznego");
        tempCV.put("symbol", "");
        tempCV.put("budynek", "E2");
        listCV.add(tempCV);

        //Dane Instytut Technologii Nieorganicznej i Nawozów Mineralnych
        tempCV  = new ContentValues();
        tempCV.put("jednostka", "3");
        tempCV.put("rodzaj", "instytut");
        tempCV.put("nazwa", "Instytut Technologii Nieorganicznej i Nawozów Mineralnych ");
        tempCV.put("symbol", "I26");
        tempCV.put("budynek", "B1");
        listCV.add(tempCV);

        //Dane  Instytut Chemii Fizycznej i Teoretycznej
        tempCV  = new ContentValues();
        tempCV.put("jednostka", "3");
        tempCV.put("rodzaj", "instytut");
        tempCV.put("nazwa", " Instytut Chemii Fizycznej i Teoretycznej");
        tempCV.put("symbol", "I30");
        tempCV.put("budynek", "B2");
        listCV.add(tempCV);



        return listCV;
    }

    private ArrayList<ContentValues> przygotuRekordyDoZapisaniaWTabeliBudynki(){

        ArrayList<ContentValues> listCV = new ArrayList<ContentValues>();
        ContentValues tempCV = new ContentValues();
        //Dane budynku A1
        tempCV.put("nazwa","A1");
        tempCV.put("adres", "Wyb. Wyspiańskiego 27 \n" + " 50-370 Wrocław");
        tempCV.put("geo1", "51.107410");
        tempCV.put("geo2", "17.062146");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A1 do cv");

        //Dane budynku A2
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A2");
        tempCV.put("adres", "Łukasiewicza 2 \n" + " 50-371 Wrocław");
        tempCV.put("geo1", "51.108230");
        tempCV.put("geo2", "17.064837");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A2 do cv");

        //Dane budynku A3
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A3");
        tempCV.put("adres", "Smoluchowskiego 23 \n" + " 50-372 Wrocław");
        tempCV.put("geo1", "51.108051");
        tempCV.put("geo2", "17.064021");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A3 do cv");

        //Dane budynku A4
        tempCV= new ContentValues();
        tempCV.put("nazwa", "A4");
        tempCV.put("adres", "Smoluchowskiego 21 \n" + " 50-372 Wrocław");
        tempCV.put("geo1", "51.108268");
        tempCV.put("geo2", "17.063143");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A4 do cv");

        //Dane budynku A5
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A5");
        tempCV.put("adres", "Smoluchowskiego 19 \n" + " 50-372 Wrocław");
        tempCV.put("geo1", "51.108610");
        tempCV.put("geo2", "17.062089");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A5 do cv");

        //Dane budynku A6
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A6");
        tempCV.put("adres", "Norwida 1/3 \n" + " 50-373 Wrocław");
        tempCV.put("geo1", "51.107957");
        tempCV.put("geo2", "17.061944");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A6 do cv");

        //Dane budynku A7
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A7");
        tempCV.put("adres", "Norwida 1/3 \n" + " 50-373 Wrocław");
        tempCV.put("geo1", "51.107957");
        tempCV.put("geo2", "17.061944");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A7 do cv");

        //Dane budynku A8
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A8");
        tempCV.put("adres", "Norwida 1/3 \n" + " 50-373 Wrocław");
        tempCV.put("geo1", "51.107957");
        tempCV.put("geo2", "17.061944");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A8 do cv");

        //Dane budynku A9
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A9");
        tempCV.put("adres", "Norwida 1/3 \n" + " 50-373 Wrocław");
        tempCV.put("geo1", "51.107957");
        tempCV.put("geo2", "17.061944");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A9 do cv");

        //Dane budynku A10
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A10");
        tempCV.put("adres", "Norwida 7 \n" + " 50-373 Wrocław");
        tempCV.put("geo1", "51.108408");
        tempCV.put("geo2", "17.061600");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A10 do cv");

        //Dane budynku A11
        tempCV = new ContentValues();
        tempCV.put("nazwa", "A11");
        tempCV.put("adres", "Norwida 1/3 \n" + " 50-373 Wrocław");
        tempCV.put("geo1", "51.107957");
        tempCV.put("geo2", "17.061944");
        listCV.add(tempCV);
        Log.d(DEBUG_TAG, "wrzuciłem dane budynku A11 do cv");
        return listCV;

    }

}



